// LanguageItemTooltipProvider.cs
//
// Author:
//   Lluis Sanchez Gual <lluis@novell.com>
//
// Copyright (c) 2008 Novell, Inc (http://www.novell.com)
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
//

using System;
using System.Collections.Generic;
using Mono.TextEditor;
using MonoDevelop.Projects.Dom;
using MonoDevelop.Projects.Dom.Output;
using MonoDevelop.Projects.Dom.Parser;
using MonoDevelop.SourceEditor;
using System.Collections.ObjectModel;

namespace MonoDevelop
{
	public class LookupNamespaceToolTipProvider: ITooltipProvider
	{		

		#region ITooltipProvider implementation 
		
		public object GetItem (TextEditor editor, int offset)
		{						
			ExtensibleTextEditor ed = (ExtensibleTextEditor) editor;
			
			ResolveResult resolvedResult = ed.GetLanguageItem(offset);
			List<String> possibleNamespaces = new List<String>();
			if(resolvedResult as MemberResolveResult != null)
			{
				MemberResolveResult member = resolvedResult as MemberResolveResult;								
			
				ProjectDom dom = ProjectDomService.GetProjectDom (ed.ProjectDom.Project);
				ReadOnlyCollection<ProjectDom> references = dom.References;
				foreach(IType type in dom.Types)
				{
					if(type.Name == member.ResolvedExpression)
					{
						possibleNamespaces.Add(type.Namespace);					
					}
				}
				foreach(ProjectDom pd  in references)
				{
					foreach(IType type2 in pd.Types)
					{
						if(type2.Name == member.ResolvedExpression)
						{
							possibleNamespaces.Add(type2.Namespace);					
						}
					}
							
				}
			
			}
			
			return possibleNamespaces;
		}
		
		public Gtk.Window CreateTooltipWindow (TextEditor editor, Gdk.ModifierType modifierType, object item)
		{
			ExtensibleTextEditor ed = (ExtensibleTextEditor) editor;
			LookupNamespaceItemWindow result = new LookupNamespaceItemWindow (ed.ProjectDom, AmbienceService.GetAmbience (ed.Document.MimeType), (IList<String>)item, null, ed);			
			if (result.IsEmpty)
				return null;
			
			return result;
		}
		
		public void GetRequiredPosition (TextEditor editor, Gtk.Window tipWindow, out int requiredWidth, out double xalign)
		{
			LookupNamespaceItemWindow win = (LookupNamespaceItemWindow)tipWindow;
			requiredWidth = win.SetMaxWidth (win.Screen.Width);
			xalign = 0.5;
		}
		
		public bool IsInteractive (TextEditor editor, Gtk.Window tipWindow)
		{
			return true;
		}
		
		#endregion 
		
	}
}
